#ifndef ELEMENTS_USER_H
#define ELEMENTS_USER_H

#include "element.h"

namespace Elements
{

struct User : public Element
{
    User() = default;
    User(const User& other);

    // -- Интерфейс элемента -- //

    virtual bool isSame(Element* other) const override;

    virtual Common::Json toJson() const override;
    virtual void fromJson(const Common::Json& json) override;

    virtual Element* clone() const override;
    virtual ElementType elementType() const override;

    // -- Интерфейс данных пользователя -- //

    std::string login() const;
    void setLogin(const std::string& value);

    std::string firstName() const;
    void setFirstName(const std::string& value);

    std::string middleName() const;
    void setMiddleName(const std::string& value);

    std::string lastName() const;
    void setLastName(const std::string& value);

    std::string email() const;
    void setEmail(const std::string& value);

    std::string passwordHash() const;
    void setPasswordHash(const std::string& value);

    bool needChangePassword() const;
    void setNeedChangePassword(const bool value);

    bool isBlocked() const;
    void setIsBlocked(const bool value);

    std::string uiLang() const;
    void setUiLang(const std::string& value);

    // -- Особый интерфейс пользователя -- //

    bool isOnline() const;
    void setIsOnline(const bool value);

    bool setPassword(const std::string& password);
    bool checkPassword(const std::string& password) const;

    std::string fullName() const;

private:
    std::string m_login;
    std::string m_firstName;
    std::string m_middleName;
    std::string m_lastName;
    std::string m_email;
    std::string m_passwordHash;
    bool m_needChangePassword = false;
    bool m_isBlocked = false;
    std::string m_uiLang;

    bool m_isOnline = false;
};

typedef std::shared_ptr<User> UserPtr;
typedef std::vector<UserPtr> Users;

} // namespace Elements

#endif // ELEMENTS_USER_H
